﻿#include "EditorImageButton.h"

#include "Widgets/Widget.h"
#include "Widgets/Mouse/MouseWidget.h"
#include "Widgets/RectangleWidget.h"
#include "Widgets/ImageWidget.h"

#include "Asset/EditorDefaultPackage.h"

#include "Window/EditorWindowGroupViewModel.h"

TSharedObjectPtr<RWidget> WHE::CreateImageButton(
    TWidgetAttribute<TSharedObjectPtr<RTexture2D>> InIcon
    ,TWidgetAttribute<CString> InToolTip
    , std::function<void()> InOnClick
    , TSharedObjectPtr<RWidget> InParentWidget
    , float ButtonSize
    , float ButtonImageSize
    )
{
    WHE::SImageButtonCreateInfo CreateInfo;
    CreateInfo.Icon=InIcon;
    CreateInfo.ToolTip=InToolTip;
    CreateInfo.OnClick=InOnClick;
    CreateInfo.ParentWidget=InParentWidget;   
    CreateInfo.Size=ButtonSize;
    CreateInfo.IconSize=ButtonImageSize;

    return CreateImageButton(CreateInfo);

}

TSharedObjectPtr<RWidget> WHE::CreateImageButton(const WHE::SImageButtonCreateInfo &InCreateInfo)
{
    auto Button=NewWidget<RMouseWidget>(InCreateInfo.ParentWidget);
    Button->Width=InCreateInfo.Size;
    Button->Height=InCreateInfo.Size;
    Button->OnClicked.BindLambda([InCreateInfo](const SMouseButtonEvent&) mutable
    {
        if(!InCreateInfo.Enabled.Get())
        {
            return false;
        }

        InCreateInfo.OnClick();
        return true;
    });
    RMouseWidgetWeakPtr ButtonWeakPtr=Button;
    Button->OnEntered.BindLambda([ButtonWeakPtr,InCreateInfo]() mutable
    {
        REditorWindowGroupViewModel::Get()->ShowToolyipLater(
            InCreateInfo.ToolTip
            ,ButtonWeakPtr
        );
    });

    Button->OnExited.BindLambda([]
    {
        REditorWindowGroupViewModel::Get()->HideTooltip();
    });


    auto Background=NewWidget<RRectangleWidget>(Button);
    Background->Anchor.Fill(Button);
    Background->FillColor=SColor::FromHexRGB(0x2B2B2B);
    Background->Radius=4;
    Background->Fill=[ButtonWeakPtr](){
        return ButtonWeakPtr->IsHovered();
    };

    auto Image=NewWidget<RImageWidget>(Button);
    Image->Image=InCreateInfo.Icon;
    Image->Width=InCreateInfo.IconSize;
    Image->Height=InCreateInfo.IconSize;;
    Image->Anchor.CenterIn(Button);
    Image->TintColor=[InCreateInfo](){
        return InCreateInfo.Enabled.Get()?SColor(1,1,1,1):SColor(0.5,0.5,0.5,1);
    };

    return Button;    
}
